/**
 * Vue文件分析器
 */
const fs = require("fs")
const { analyzeJavaScript, findDependenciesByRegex } = require("./jsAnalyzer")
const { analyzeCSS } = require("./cssAnalyzer")

/**
 * 简单解析Vue文件的不同部分
 * @param {string} content - Vue文件内容
 * @returns {Object} 包含script、template和style部分的对象
 */
function parseVueContent(content) {
  const parts = {
    script: "",
    template: "",
    style: "",
  }

  // 提取<script>部分
  const scriptRegex = /<script(?:\s+[^>]*)?>([\s\S]*?)<\/script>/g
  let scriptMatch
  while ((scriptMatch = scriptRegex.exec(content)) !== null) {
    parts.script += scriptMatch[1] + "\n"
  }

  // 提取<template>部分
  const templateRegex = /<template(?:\s+[^>]*)?>([\s\S]*?)<\/template>/g
  let templateMatch
  while ((templateMatch = templateRegex.exec(content)) !== null) {
    parts.template += templateMatch[1] + "\n"
  }

  // 提取<style>部分
  const styleRegex = /<style(?:\s+[^>]*)?>([\s\S]*?)<\/style>/g
  let styleMatch
  while ((styleMatch = styleRegex.exec(content)) !== null) {
    parts.style += styleMatch[1] + "\n"
  }

  return parts
}

/**
 * 分析Vue文件依赖
 * @param {string} filePath - 文件路径
 * @param {string} content - 文件内容
 * @returns {string[]} 依赖路径数组
 */
function analyzeVue(filePath, content) {
  const dependencies = []
  const parts = parseVueContent(content)

  // 分析<script>中的依赖
  if (parts.script) {
    try {
      const scriptDeps = analyzeJavaScript(filePath, parts.script)
      dependencies.push(...scriptDeps)
    } catch (error) {
      console.error(`解析Vue脚本部分失败: ${filePath}`, error.message)
      // 退回到正则方式
      const regexDeps = findDependenciesByRegex(parts.script)
      dependencies.push(...regexDeps)
    }
  }

  // 分析<style>中的依赖
  if (parts.style) {
    const styleDeps = analyzeCSS(filePath, parts.style)
    dependencies.push(...styleDeps)
  }

  // 分析<template>中的src属性
  const srcRegex = /src=["']([^"']+)["']/g
  let srcMatch
  while ((srcMatch = srcRegex.exec(content)) !== null) {
    dependencies.push(srcMatch[1])
  }

  // 返回去重后的依赖列表
  return [...new Set(dependencies)]
}

/**
 * 从文件中分析Vue依赖
 * @param {string} filePath - 文件路径
 * @returns {string[]} 依赖路径数组
 */
function analyzeFile(filePath) {
  try {
    const content = fs.readFileSync(filePath, "utf-8")
    return analyzeVue(filePath, content)
  } catch (error) {
    console.error(`读取文件 ${filePath} 失败:`, error.message)
    return []
  }
}

module.exports = {
  analyzeVue,
  analyzeFile,
  parseVueContent,
}
